package hotn

// PageRangeType 页面范围类型枚举
// 用于指定骑缝章应用的页面范围
type PageRangeType int

const (
	// PageRangeAll 所有页面
	PageRangeAll PageRangeType = iota
	// PageRangeOdd 仅奇数页
	PageRangeOdd
	// PageRangeEven 仅偶数页
	PageRangeEven
	// PageRangeFirst 仅首页
	PageRangeFirst
	// PageRangeLast 仅尾页
	PageRangeLast
	// PageRangeFirstLast 首页+尾页
	PageRangeFirstLast
)

// String 返回页面范围类型的字符串表示
// 功能: 将PageRangeType枚举值转换为可读的字符串
// 返回值:
//   - string: 页面范围类型的描述字符串
func (p PageRangeType) String() string {
	switch p {
	case PageRangeAll:
		return "所有页面"
	case PageRangeOdd:
		return "奇数页"
	case PageRangeEven:
		return "偶数页"
	case PageRangeFirst:
		return "首页"
	case PageRangeLast:
		return "尾页"
	case PageRangeFirstLast:
		return "首页+尾页"
	default:
		return "未知类型"
	}
}

// IsValid 检查页面范围类型是否有效
// 功能: 验证PageRangeType枚举值是否在有效范围内
// 返回值:
//   - bool: 如果类型有效返回true，否则返回false
func (p PageRangeType) IsValid() bool {
	return p >= PageRangeAll && p <= PageRangeFirstLast
}

// PageRange 页面范围结构体
// 用于指定连续的页面范围，如第2-8页
type PageRange struct {
	Start int // 起始页码（包含）
	End   int // 结束页码（包含）
}

// IsValid 检查页面范围是否有效
// 功能: 验证页面范围的起始和结束页码是否合理
// 返回值:
//   - bool: 如果范围有效返回true，否则返回false
func (pr PageRange) IsValid() bool {
	return pr.Start > 0 && pr.End >= pr.Start
}

// Contains 检查指定页码是否在范围内
// 功能: 判断给定页码是否在当前页面范围内
// 参数:
//   - page: 要检查的页码
//
// 返回值:
//   - bool: 如果页码在范围内返回true，否则返回false
func (pr PageRange) Contains(page int) bool {
	return page >= pr.Start && page <= pr.End
}

// PageSelector 页面选择器结构体
// 提供灵活的页面选择方式，支持枚举类型、具体页面列表和页面范围列表
type PageSelector struct {
	RangeType   PageRangeType // 页面范围类型（向后兼容）
	PageNumbers []int         // 指定具体页面列表，如[1,3,5,10]
	PageRanges  []PageRange   // 指定页面范围列表，如[{1,3},{8,10}]
}

// IsEmpty 检查页面选择器是否为空
// 功能: 判断页面选择器是否没有设置任何选择条件
// 返回值:
//   - bool: 如果选择器为空返回true，否则返回false
func (ps PageSelector) IsEmpty() bool {
	return ps.RangeType == PageRangeAll && len(ps.PageNumbers) == 0 && len(ps.PageRanges) == 0
}

// HasCustomSelection 检查是否有自定义页面选择
// 功能: 判断是否设置了具体页面或页面范围（非枚举类型）
// 返回值:
//   - bool: 如果有自定义选择返回true，否则返回false
func (ps PageSelector) HasCustomSelection() bool {
	return len(ps.PageNumbers) > 0 || len(ps.PageRanges) > 0
}

// A4PaperWidth A4纸宽度
// 单位：POINTS（1 POINTS = 1/72英寸）
const A4PaperWidthPoints = 595.28
const A4PaperHeightPoints = 841.89

type RidingStampPosition string

const (
	RidingStampPositionLeft   RidingStampPosition = "l"
	RidingStampPositionRight  RidingStampPosition = "r"
	RidingStampPositionTop    RidingStampPosition = "t"
	RidingStampPositionBottom RidingStampPosition = "b"
)
